package com.zyl.blog.common.strategy;

/**
 * @version v1.0
 * @ProjectName: Personal_Blog_Server
 * @Package: com.zyl.blog.common.strategy
 * @ClassName: BirthdaySensitiveStrategy
 * @Description:
 * @Author FinalFantasy
 * @Date 2025/9/8-15:11
 */

import com.zyl.blog.common.annotation.Sensitive;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

/**
 * 生日脱敏策略
 * 规则：根据展示粒度控制脱敏程度，默认只保留年份
 * 例：1990-**-**（默认）、1990-01-**（保留年月）、1990-01-01（完整展示，需授权）
 */
public class BirthdaySensitiveStrategy extends AbstractSensitiveStrategy {

    // 日期格式化器
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    @Override
    public String desensitize(String value, Sensitive annotation) {
        // 空值或非日期格式直接返回
        if (value == null || value.length() != 10) {
            return value;
        }

        try {
            // 解析日期（确保格式正确）
            LocalDate.parse(value, FORMATTER);
            int prefixLen = annotation.prefixLen();

            /*
             * 前缀长度控制脱敏粒度：
             * prefixLen=4 → 只保留年份（1990-**-**）
             * prefixLen=7 → 保留年月（1990-01-**）
             * prefixLen=10 → 完整展示（需特殊权限）
             */
            int actualPrefix = prefixLen > 0 ? prefixLen : 4;

            if (actualPrefix >= 10) {
                return value; // 完整展示
            }

            StringBuilder sb = new StringBuilder(value.substring(0, actualPrefix));
            /* 补充剩余部分为 */
            for (int i = actualPrefix; i < value.length(); i++) {
                if (value.charAt(i) == '-') {
                    sb.append('-'); // 保留分隔符
                } else {
                    sb.append(annotation.maskChar());
                }
            }
            return sb.toString();

        } catch (Exception e) {
            /* 日期格式错误时返回原值 */
            return value;
        }
    }
}
